package org.dbstar.scheduler.control;

import java.util.Map;

import org.dbstar.scheduler.beans.Job;
import org.dbstar.scheduler.control.exception.DaoException;
import org.dbstar.scheduler.control.exception.SubmitException;
import org.dbstar.scheduler.identifier.Identifier;
import org.dbstar.scheduler.job.IllegalFactoryException;


/**
 * Job执行调度器接口类
 * 
 * @author 代波
 * @since 1.0.0
 * @version 1.0.0
 * @date 2012-3-30
 */
public interface JobSchedulerExecutor {
	/**
	 * 根据Job定义标识来提交一个Job
	 * 
	 * @param jobConfIdentifier job定义的标识
	 * @param parameters job的参数，与job定义中描述的参数定义对应
	 * @param submitter Job提交人
	 * @return 提交执行的Job
	 * @throws SubmitException 提交任务异常时抛出
	 * @throws IllegalFactoryException 若无法正确构建Job时抛出
	 */
	public abstract Job submit(Identifier jobConfIdentifier, Map<String, String> parameters, String submitter)
			throws SubmitException, IllegalFactoryException;

	/**
	 * 暂停一个Job。
	 * 
	 * 可以暂停的状态有：
	 * 
	 * <pre>
	 * ready -> pause
	 * queue -> pause
	 * </pre>
	 * 
	 * @param jobIdentifier Job标识
	 * @throws DaoException
	 */
	public abstract boolean pause(Identifier jobIdentifier) throws DaoException;

	/**
	 * 恢复一个暂停的任务。只能从暂停状态恢复。
	 * 
	 * <pre>
	 * pause -> ready
	 * </pre>
	 * 
	 * @param jobIdentifier Job标识
	 * @throws DaoException
	 */
	public abstract boolean resume(Identifier jobIdentifier) throws DaoException;

	/**
	 * 取消一个Job。
	 * 
	 * 可以取消的状态有：
	 * 
	 * <pre>
	 * ready -> cancel
	 * queue -> cancel
	 * pause -> cancel
	 * </pre>
	 * 
	 * @param jobIdentifier Job标识
	 * @throws DaoException
	 */
	public abstract boolean cancel(Identifier jobIdentifier) throws DaoException;

	/**
	 * 终止一个正在运行的Job。
	 * 
	 * <pre>
	 * run -> kill
	 * </pre>
	 * 
	 * @param jobIdentifier Job标识
	 * @throws DaoException
	 */
	public abstract boolean kill(Identifier jobIdentifier) throws DaoException;

	/**
	 * 关闭执行调度器
	 * 
	 * @throws InterruptedException
	 * @throws DaoException
	 */
	public abstract void shutdown() throws InterruptedException, DaoException;

}